package com.dongdongshop.aop;

import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect   //表示一个切面类
@Component
public class LogAop {
    
    Logger logger = LoggerFactory.getLogger(LogAop.class);
    
    // 第一个 * 表示任何返回值     第二个 * 表示所有的类  第三个 * 表示所有的方法  .. 表示方法中所有的参数
    @Pointcut("execution(public * com.dongdongshop.service.*.*(..))")
    public void log(){
    }

    //前置通知
    @Before("log()") //可以写多个切点表达式,由这里进行切换
    public void logBefore(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();
        Signature signature = joinPoint.getSignature();
        logger.info("调用 service {}方法成功 参数为: {}",signature,args);
    }

    //返回后通知
    @AfterReturning(pointcut = "log()",returning = "object")
    public void logAfter(Object object) throws Throwable {
        logger.info("方法调用执行成功,返回值为: {}", JSONObject.toJSONString(object));
    }
}
